import { type ImportAppMeta } from '@cdyun/types'
import { type ProxyOptions } from 'vite'

/**
 * 配置 Vite 服务器
 *
 * @param env 导入的元信息
 * @returns 返回一个包含服务器配置信息的对象
 * @throws 如果 VITE_PORT 无效，则抛出错误
 */
export function setupViteServer(env: ImportAppMeta) {
	const vitePort = parseInt(env.VITE_PORT, 10)
	if (isNaN(vitePort) || vitePort <= 0 || vitePort > 65535) {
		throw new Error('Invalid VITE_PORT value. Please provide a valid port number.')
	}

	const viteOpen = typeof env.VITE_OPEN === 'string' ? JSON.parse(env.VITE_OPEN) : false
	const viteProxy = typeof env.VITE_PROXY === 'string' ? JSON.parse(env.VITE_PROXY) : []

	return {
		host: 'localhost', // 假设默认主机名为 'localhost'
		port: vitePort, // 使用转换后的数字作为端口
		open: viteOpen, // 在服务器启动时是否自动在浏览器中打开应用程序
		hmr: true,
		proxy: resolveProxy(viteProxy)
	}
}
/**
 * 解析vite代理配置
 * @param proxyList 代理配置列表，每个元素是一个由前缀和目标URL组成的数组
 */
function resolveProxy(proxyList: [string, string][]): Record<string, ProxyOptions> {
	const proxy: Record<string, ProxyOptions> = {}

	// 确保传入的代理配置列表是一个二维数组，每个元素都是[prefix, target]格式
	if (!Array.isArray(proxyList) || proxyList.some((item) => !Array.isArray(item) || item.length !== 2)) {
		throw new Error('无效的代理配置列表格式。每个元素应是一个包含[前缀, 目标]的数组。')
	}

	const createRewritePattern = (prefix: string): RegExp => new RegExp(`^${escapeRegExp(prefix)}`)

	for (const [prefix, target] of proxyList) {
		if (!isValidUrl(target)) {
			throw new Error(`无效的目标URL: ${target}`)
		}
		const isHttps = /^https:\/\//.test(target)
		proxy[prefix] = {
			target: target,
			changeOrigin: true,
			ws: true,
			rewrite: (path) => path.replace(createRewritePattern(prefix), ''),
			// 当目标URL是HTTPS时，将secure设置为false，以避免证书错误
			...(isHttps ? { secure: false } : {})
		}
	}
	return proxy
}

// 辅助函数：转义正则表达式中的特殊字符
function escapeRegExp(text: string): string {
	return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // $&表示整个被匹配的字符串
}

// 辅助函数：验证URL的合法性
function isValidUrl(urlString: string): boolean {
	try {
		new URL(urlString)
		return true
	} catch (_) {
		return false
	}
}
